SpringMVC获取Get请求参数的几种方式

引言

📨本篇主要罗列获取Get请求参数方法的区别📨

代码

先看如下两段基于@GetMapping注解的方法👇

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@GetMapping("/page")
public R<Page> page(int page, int pageSize, String name){
log.info("page={}, pageSize={}, name={}", page, pageSize, name);

//创建页面对象
Page pageInfo = new Page(page,pageSize);
//配置分页条件
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper();
queryWrapper.like(StringUtils.isNotEmpty(name), Employee::getName, name);
queryWrapper.orderByDesc(Employee::getUpdateTime);

employeeService.page(pageInfo, queryWrapper);

return R.success(pageInfo);
}
1
2
3
4
5
6
7
8
@GetMapping("/{id}")
public R<Employee> getByID(@PathVariable Long id){
Employee employee = employeeService.getById(id);
if (employee != null) {
return R.success(employee);
}
return R.error("查询失败!");
}

说明

上面两段代码中:

后端用参数接收

第一种属于传统方式的Get请求参数获取方法,即参数跟在问号后面。
我们假有这样一段请求需要处理:http://localhost:8080/helloworld?name=张三
则Controller中的处理代码如下👇

1
2
3
4
5
6
7
8
9
10
11
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;

@RestController
public class HelloController {
@GetMapping("/helloworld")
public String helloworld1(@RequestParam("name") String name) {
return "获取到的name是:" + name;
}
}

@RequestParam使用

这种方式涉及了@RequestParam注解的使用,关于该注解总结如下👇

  • 不加@RequestParam,前端的参数名需要和后端控制器的变量名保持一致才能生效

  • 不加@RequestParam,参数为非必传,加@RequestParam写法参数为必传。但@RequestParam可以通过@RequestParam(required = false)设置为非必传。

  • @RequestParam可以通过@RequestParam(“userId”)或者@RequestParam(value = “userId”)指定传入的参数名。

  • @RequestParam可以通过@RequestParam(defaultValue = “0”)指定参数默认值

  • 如果接口除了前端调用还有后端RPC调用,则不能省略@RequestParam,否则RPC会找不到参数报错

  • 访问时:

    • 不加@RequestParam注解:url可带参数也可不带参数
    • 加@RequestParam注解:url必须带有参数

后端用路径接收

第二种是典型的 RESTful 风格,ID参数值直接放在路径里面。
我们假有这样一段请求需要处理:http://localhost:8080/helloworld/张三
则Controller中的处理代码如下👇

1
2
3
4
5
6
7
8
9
10
11
12
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

@GetMapping("/helloworld/{name}")
public String helloworld(@PathVariable("name") String name) {
return "获取到的name是:" + name;
}
}

@PathVariable使用

通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的形参中。

  • 若方法参数名称和需要绑定的url中变量名称一致时,可以简写:

    1
    2
    3
    4
    5
    6
    7
    8
    @GetMapping("/{id}")
    public R<Employee> getByID(@PathVariable Long id){
    Employee employee = employeeService.getById(id);
    if (employee != null) {
    return R.success(employee);
    }
    return R.error("查询失败!");
    }
  • 若方法参数名称和需要绑定的url中变量名称不一致时,写成:

    1
    2
    3
    4
    5
    6
    7
    8
    @GetMapping("/{id}")
    public R<Employee> getByID(@PathVariable("id") Long empId){
    Employee employee = employeeService.getById(empId);
    if (employee != null) {
    return R.success(employee);
    }
    return R.error("查询失败!");
    }

    用POJO实体类接收

    此处定义一个简单的POJO如下👇

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     public class User {
    private String name;
    private Integer age;

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public Integer getAge() {
    return age;
    }

    public void setAge(Integer age) {
    this.age = age;
    }
    }

定义一个RestController如下👇

1
2
3
4
5
6
7
8
9
10
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;

@RestController
public class HelloController {
@GetMapping("/helloworld")
public String helloworld(User user) {
return "name:" + user.getName();
}
}

现在给出一个GET请求:http://localhost:8080/helloworld?name=张三
则浏览器可以看到:name: 张三

后端用数组接收

1
2
3
4
@GetMapping("/array")
public Integer[] array(Integer[] a) {
return a;
}

前端则调用url:localhost:8080/user/array?a=1&a=2&a=3

当然,这里也可用List来接收,不过需要加上@RequestParam(“a”)注解

如果直接使用List来接收,也不加上@RequestParam(“a”)注解的话,则会报错: No primary or default constructor found for interface java.util.List

后端使用Map接收

1
2
3
4
5
6
@GetMapping("/loginByMap")
public User loginByMap(@RequestParam Map<String, Object> map) {
String name = (String) map.get("name");
int age = Integer.parseInt((String) map.get("age"));
return new User(name, age);
}

前端则调用url:localhost:8080/user/loginByMap?name=tom&age=12

⚠️值得注意的是,这里的map参数前需要加@RequestParam注解,用于将请求参数注入到map中。

文章作者: GeYu
文章链接: https://nuistgy.github.io/2022/09/13/SpringMVC - 获取Get请求参数详解/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yu's Blog